package Test28;

//Object类的使用
/*
protected object clone(int a)           对象克隆
 */

import com.google.gson.Gson;

import java.util.StringJoiner;


public class Test10 {
    public static void main(String[] args) throws CloneNotSupportedException {

        //1、先创建一个对象
        int[] data = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 0};
        User u1 = new User(1, "zhangsan", "1234qwer", "girl11", data);

        //2、克隆对象
        //细节：
        //方法在底层会帮我们创建一个对象，并把原对象中的数据拷贝过去。
        //书写细节：
        //1、重写Object中的clone方法
        //2、让JavaBean类实现Cloneable接口
        //3、创建原对象并调用clone方法就可以了。
        User u2 = (User) u1.clone();

        /*//验证一件事情：Object中的克隆是浅克隆
        int[] arr1 = u1.getData();
        arr1[0] = 100;

        //System.out.println(u1);
        //System.out.println(u2);*/

        //第三方工具
        //1、第三方写的代码导入项目中
        //2、编写代码
        Gson gson = new Gson();
        //把对象变成一个字符串
        String s = gson.toJson(u1);
        //再把字符串变回对象就可以了
        User user = gson.fromJson(s, User.class);

        int[] arr = u1.getData();
        arr[0] = 100;

        //打印对象
        System.out.println(user);
    }
}


//Cloneable
//如果一个接口里面没有抽象方法
//表示当前的接口是一个标记性接口
//现在cloneable表示一旦了实现，那么当前类的对象就可以被克隆
//如果没有实现，当前类的对象就不能克隆
class User implements Cloneable {
    private int id;//游戏角色
    private String username;//用户名
    private String password;//密码
    private String path;//游戏图片
    private int[] data;//游戏进度

    public User() {
    }

    public User(int id, String username, String password, String path, int[] data) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.path = path;
        this.data = data;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getPath() {
        return path;
    }

    public void setPath(String path) {
        this.path = path;
    }

    public int[] getData() {
        return data;
    }

    public void setData(int[] data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "角色编号为：" + id + ", 用户名" + username + ", 密码" + password + ", 游戏图片" + path + ", 进度" + arrToString();
    }

    public String arrToString() {
        StringJoiner sj = new StringJoiner(", ", "[", "]");
        for (int i = 0; i < data.length; i++) {
            sj.add(data[i] + "");
        }
        return sj.toString();
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        //调用父类中的clone方法
        //相当于让Java帮我们克隆一个对象，并把克隆之后的对象返回出去。

        //先把被克隆对象中的数组获取出来
        int[] data = this.data;
        //创建新的数组
        int[] newData = new int[data.length];
        //拷贝数组中的数据
        for (int i = 0; i < data.length; i++) {
            newData[i] = data[i];
        }
        //调用父类中的方法克隆对象
        User u = (User) super.clone();
        //因为父类中的克隆方法是浅克隆，替换克隆出来对象中的数组地址值
        u.data = newData;
        return u;
    }
}
